#include "bsp_spi.h" // Device header
#include "../w25q64/w25q64.h"

/**
 * 函    数：SPI初始化
 * 参    数：无
 * 返 回 值：无
 */
void SPI_Init(ECSPI_Type *SPI) {

  /* 60MHZ设置分频 6MHZ*/
  // 0---0xf
  SPI->CONREG &= ~(0xf << 12);
  SPI->CONREG |= (0x9 << 12);
  // 0---15
  SPI->CONREG &= ~(0xF << 8);

  /*GPIO初始化*/

  /*SPI初始化*/
  SPI->CONREG |= (0x7 << 20);
  SPI->CONREG &= ~(0x3 << 18);
  SPI->CONREG |= (0x1 << 4);
  SPI->CONREG |= (0x1 << 3);

  SPI->CONFIGREG &= ~(0x1 << 0);
  SPI->CONFIGREG &= ~(0x1 << 4);
  SPI->CONFIGREG &= ~(0x1 << 8);
  SPI->CONFIGREG &= ~(0x12 << 12);
  SPI->CONFIGREG &= ~(0x12 << 16);
  SPI->CONFIGREG &= ~(0x12 << 20);
  SPI->CONFIGREG |= (0x1 << 4);

  SPI->PERIODREG &= ~(0x1 << 15);
  SPI->PERIODREG |= (0x2000 << 0);

  /*SPI使能*/
  SPI_Enable(SPI); // 使能SPI1，开始运行

  /*设置默认电平*/
  SPI_W_SS(1); // SS默认高电平
}

/**
 * @brief SPI使能
 *
 * @param SPI ECSPI_Type
 */
void SPI_Enable(ECSPI_Type *SPI) {
  SPI->CONREG |= (0x1); // SPI使能
}

/**
 * 函    数：SPI起始
 * 参    数：无
 * 返 回 值：无
 */
void SPI_Start(ECSPI_Type *SPI) {
  SPI_W_SS(0); // 拉低SS，开始时序
}

/**
 * 函    数：SPI终止
 * 参    数：无
 * 返 回 值：无
 */
void SPI_Stop(ECSPI_Type *SPI) {
  SPI_W_SS(1); // 拉高SS，终止时序
}

/**
 * @brief SPI交换传输一个字节，使用SPI模式0
 *
 * @param SPI ECSPI_Type
 * @param ByteSend ByteSend 要发送的一个字节
 * @return uint8_t 接收的一个字节
 */
uint8_t SPI_SwapByte(ECSPI_Type *SPI, uint8_t ByteSend) {

  unsigned int rxdata = 0;
  unsigned int txdata = ByteSend;

  SPI->CONREG &= ~(0x3 << 18);

  while (!(SPI->STATREG & (0x1 << 0))) {
  }
  SPI->TXDATA = txdata;
  // SPI->STATREG &= ~(0x1 << 0);

  while (!(SPI->STATREG & (0x1 << 3))) {
  }
  rxdata = SPI->RXDATA;
  // SPI->STATREG &= ~(0x1 << 3);

  return rxdata;
}
